import request from './config'
import { showToast } from 'vant'

// 商品类型定义
export interface Product {
  id: string | number;
  productName: string;
  categoryId: string | number;
  categoryName?: string;
  price: number;
  photo?: string;
  description?: string;
  createTime?: string;
  updateTime?: string;
}

// 查询参数
export interface ProductQuery {
  productName?: string;
  categoryId?: string | number;
  current?: number;
  size?: number;
}

// 分页结果
export interface PageResult<T> {
  records: T[];
  total: number;
  size: number;
  current: number;
  pages: number;
}

/**
 * 添加商品
 * @param product 商品信息
 * @param imageFile 商品图片文件
 */
export const addProduct = async (product: Omit<Product, 'id'>, imageFile?: File): Promise<boolean> => {
  try {
    const formData = new FormData();
    
    // 如果有图片文件，添加到formData
    if (imageFile) {
      formData.append('imageFile', imageFile);
      
      // 创建一个不包含图片信息的产品对象
      const productData = { ...product };
      const productBlob = new Blob([JSON.stringify(productData)], { type: 'application/json' });
      formData.append('product', productBlob);
      
      const { data } = await request({
        url: '/product/add',
        method: 'POST',
        data: formData,
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      });
      
      if (data.code === 200) {
        showToast({
          type: 'success',
          message: '添加商品成功',
          position: 'bottom'
        });
        return true;
      }
    } else {
      // 没有图片，直接发送JSON数据
      const { data } = await request({
        url: '/product/add',
        method: 'POST',
        data: product,
        headers: {
          'Content-Type': 'application/json'
        }
      });
      
      if (data.code === 200) {
        showToast({
          type: 'success',
          message: '添加商品成功',
          position: 'bottom'
        });
        return true;
      }
    }
    
    showToast({
      type: 'fail',
      message: data?.msg || '添加商品失败',
      position: 'bottom'
    });
    return false;
  } catch (error) {
    console.error('添加商品失败:', error);
    showToast({
      type: 'fail',
      message: '添加商品失败',
      position: 'bottom'
    });
    return false;
  }
};

/**
 * 更新商品
 * @param product 商品信息
 * @param imageFile 商品图片文件
 */
export const updateProduct = async (product: Product, imageFile?: File): Promise<boolean> => {
  try {
    if (imageFile) {
      const formData = new FormData();
      
      // 创建一个不包含图片信息的产品对象
      const productData = { ...product };
      const productBlob = new Blob([JSON.stringify(productData)], { type: 'application/json' });
      formData.append('product', productBlob);
      formData.append('imageFile', imageFile);
      
      const { data } = await request({
        url: '/product/update',
        method: 'POST',
        data: formData,
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      });
      
      if (data.code === 200) {
        showToast({
          type: 'success',
          message: '更新商品成功',
          position: 'bottom'
        });
        return true;
      }
    } else {
      // 没有图片，直接发送JSON数据
      const { data } = await request({
        url: '/product/update',
        method: 'POST',
        data: product,
        headers: {
          'Content-Type': 'application/json'
        }
      });
      
      if (data.code === 200) {
        showToast({
          type: 'success',
          message: '更新商品成功',
          position: 'bottom'
        });
        return true;
      }
    }
    
    showToast({
      type: 'fail',
      message: data?.msg || '更新商品失败',
      position: 'bottom'
    });
    return false;
  } catch (error) {
    console.error('更新商品失败:', error);
    showToast({
      type: 'fail',
      message: '更新商品失败',
      position: 'bottom'
    });
    return false;
  }
};

/**
 * 删除商品
 * @param id 商品ID
 */
export const deleteProduct = async (id: string | number): Promise<boolean> => {
  try {
    const { data } = await request({
      url: '/product/delete',
      method: 'POST',
      params: { id }
    });
    
    if (data.code === 200) {
      showToast({
        type: 'success',
        message: '删除商品成功',
        position: 'bottom'
      });
      return true;
    }
    
    showToast({
      type: 'fail',
      message: data.msg || '删除商品失败',
      position: 'bottom'
    });
    return false;
  } catch (error) {
    console.error('删除商品失败:', error);
    showToast({
      type: 'fail',
      message: '删除商品失败',
      position: 'bottom'
    });
    return false;
  }
};

/**
 * 根据ID获取商品详情
 * @param id 商品ID
 */
export const getProductById = async (id: string | number): Promise<Product | null> => {
  try {
    const { data } = await request({
      url: '/product/getById',
      method: 'POST',
      params: { id }
    });
    
    if (data.code === 200 && data.data) {
      return data.data;
    }
    
    showToast({
      type: 'fail',
      message: data.msg || '获取商品详情失败',
      position: 'bottom'
    });
    return null;
  } catch (error) {
    console.error('获取商品详情失败:', error);
    showToast({
      type: 'fail',
      message: '获取商品详情失败',
      position: 'bottom'
    });
    return null;
  }
};

/**
 * 获取所有商品列表
 */
export const getProductList = async (): Promise<Product[]> => {
  try {
    const { data } = await request({
      url: '/product/list',
      method: 'POST'
    });
    
    if (data.code === 200 && data.data) {
      return data.data;
    }
    
    showToast({
      type: 'fail',
      message: data.msg || '获取商品列表失败',
      position: 'bottom'
    });
    return [];
  } catch (error) {
    console.error('获取商品列表失败:', error);
    showToast({
      type: 'fail',
      message: '获取商品列表失败',
      position: 'bottom'
    });
    return [];
  }
};

/**
 * 分页查询商品
 * @param query 查询参数
 */
export const pageProducts = async (query: ProductQuery): Promise<PageResult<Product>> => {
  try {
    const { data } = await request({
      url: '/product/page',
      method: 'POST',
      data: query
    });
    
    if (data.code === 200 && data.data) {
      return data.data;
    }
    
    showToast({
      type: 'fail',
      message: data.msg || '获取商品分页数据失败',
      position: 'bottom'
    });
    return {
      records: [],
      total: 0,
      size: 10,
      current: 1,
      pages: 0
    };
  } catch (error) {
    console.error('获取商品分页数据失败:', error);
    showToast({
      type: 'fail',
      message: '获取商品分页数据失败',
      position: 'bottom'
    });
    return {
      records: [],
      total: 0,
      size: 10,
      current: 1,
      pages: 0
    };
  }
}; 